/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.util;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

/**
 *
 * @author rufersic
 */
public class LeerXml {

    //los siguientes 2 metodos son para prueba y consiste en mostrar los elementos de un array
//    public static void mostrarelementosStringArray(String v[]) {
//        for (int i = 0; i < v.length; i++) {
//            System.out.println(v[i]);
//        }
//    }

//    public static void mostrarelementosInt(int v[]) {
//        for (int i = 0; i < v.length; i++) {
//            System.out.println(v[i]);
//        }
//    }

    public static int contar_espacios_en_String(String cadena) {
        int contador = 0;
        for (int i = 0; i < cadena.length(); i++) {
            if (cadena.charAt(i) == ' ') {
                contador++;
            }
        }
        return contador;
    }

    public static void guardar_elementos_String_en_Lista(String cadena, List v) {
        String cadenaauxiliar = "";
        
        for (int i = 0; i < cadena.length(); i++) {
            if (cadena.charAt(i) != ' ') {
                cadenaauxiliar = cadenaauxiliar + cadena.charAt(i);
                if (i == cadena.length() - 1) {
                    v.add(cadenaauxiliar);
                }
            } else {
                v.add(cadenaauxiliar);
                
                cadenaauxiliar = "";
            }

        }
    }

    public static void guardar_elementos_int_en_List(String cadena, List v) {
        String cadenaauxiliar = "";
        int j = 0;
        for (int i = 0; i < cadena.length(); i++) {
            if (cadena.charAt(i) != ' ') {
                cadenaauxiliar = cadenaauxiliar + cadena.charAt(i);
                if (i == cadena.length() - 1) {
                    v.add(Integer.parseInt(cadenaauxiliar));
                    }
            } else {
                 v.add(Integer.parseInt(cadenaauxiliar));
                 cadenaauxiliar = "";
            }

        }
    }

    public static Automata cargarXml(String url) {
        System.out.println("cargando xml");
        Automata automata = new Automata();
        String prueba = "";
        //Se crea un SAXBuilder para poder parsear el archivo
        SAXBuilder builder = new SAXBuilder();
//        File xmlFile = new File("archivo.xml");
        File xmlFile = new File(url);
        try {
            //Se crea el documento a traves del archivo
            Document document = (Document) builder.build(xmlFile);

            //Se obtiene la raiz 'AUTOMATA_AFN'
            Element rootNode = document.getRootElement();

            //Se obtiene la lista de hijos de la raiz 'AUTOMATA_AFN'
            List list = rootNode.getChildren("ALFABETO");

            //Se obtiene el elemento 'ALFABETO'
            Element alfabeto = (Element) list.get(0);
            String alfabet = alfabeto.getTextTrim();
            //realizamos un ciclo que recorra el string alfabeto
            //y cuente los espacios vacios
            int num_espacios = contar_espacios_en_String(alfabet);
            //el numero de elementos en el alfabeto es =cantidad de espacios en blanco+1
            //creamos nuestro array de alfabeto
            List<String> alfabeto_final = new ArrayList<String>();
            guardar_elementos_String_en_Lista(alfabet, alfabeto_final);
            //automata.setConjunto_alfabeto(alfabeto_final);
              automata.setConjunto_alfabeto(alfabeto_final);
                      
            List list2 = rootNode.getChildren("ESTADO");
            Element estate = (Element) list2.get(0);
            String estados = estate.getTextTrim();
            num_espacios = contar_espacios_en_String(estados);
            List<Integer>conjuto_estados=new ArrayList<>();
            //int conjuto_estados[] = new int[num_espacios + 1];
            guardar_elementos_int_en_List(estados, conjuto_estados);
            automata.setConjunto_estados(conjuto_estados);


            List list3 = rootNode.getChildren("INICIAL");
            Element ini = (Element) list3.get(0);
            String estado_inicial = ini.getTextTrim();
            automata.setEstado_inicial(Integer.parseInt(estado_inicial));

            List list4 = rootNode.getChildren("FINAL");
            Element f = (Element) list4.get(0);
            String fin = f.getTextTrim();
            num_espacios = contar_espacios_en_String(fin);
            List<Integer>estados_finales=new ArrayList<>();
            guardar_elementos_int_en_List(fin, estados_finales);
            automata.setEstados_finales(estados_finales);

            List list5 = rootNode.getChildren("TRANSICIONES");
            Element trans = (Element) list5.get(0);
            String transicion = trans.getTextTrim();
            num_espacios = contar_espacios_en_String(transicion);
            List<String>trasiciones=new ArrayList<>();
            guardar_elementos_String_en_Lista(transicion, trasiciones);
            automata.setConjunto_trasiciones(trasiciones);


            //System.out.println("\t" + alfabet + "\t\t" + estado + "\t\t" + inicial + "\t\t" + fin + "\t\t" + transicion);
            // }

        } catch (IOException io) {
            System.out.println(io.getMessage());
        } catch (JDOMException jdomex) {
            System.out.println(jdomex.getMessage());
        }



        //veremos el correcto funcionamiento de esta clase
        //mostremos los atributos de el automata
//          System.out.println("mostrando atributos de el automata generado");
//          System.out.println("estado inicial: "+automata.getEstado_inicial());
//          System.out.println("alfabeto : ");
//          mostrarelementosStringArray(automata.getConjunto_alfabeto());
//          System.out.println("estados : ");
//          mostrarelementosIntArray(automata.getConjunto_estados());
//          System.out.println("estados finales: ");
//          mostrarelementosIntArray(automata.getEstados_finales());
//         System.out.println("trasiciones: ");
//         mostrarelementosStringArray(automata.getConjunto_trasiciones());
//          automata.generarMatriz();
        return automata;
    }
}
